home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / dev / e / amigae21b.lha / Amiga_E_v2.1b / Sources / Utilities / ShowChunk.e < prev    next >
Text File  |  1992-09-02  |  9KB  |  288 lines

  1. /* simple IFF chunk-dump program */
  2.  
  3. ENUM ER_NONE, ER_FILE, ER_MEM, ER_USAGE, ER_BREAK, ER_FILETYPE, ER_CORRUPT
  4.  
  5. OBJECT bmhd
  6.   w:INT,h:INT,x:INT,y:INT
  7.   planes:CHAR
  8.   masking:CHAR
  9.   compression:CHAR
  10.   transcolour:INT
  11.   xaspect:CHAR,yaspect:CHAR
  12.   pagew:INT,pageh:INT
  13. ENDOBJECT
  14.  
  15. OBJECT dbhd
  16.   firstindex:INT
  17.   recordsize:INT
  18. ENDOBJECT
  19.  
  20. DEF flen,o:PTR TO LONG,mem,handle=NIL,chunkid,ifftype,size,off=-1
  21.  
  22. PROC main()
  23.   WriteF('ShowChunk v0.1 (c) 1992 $#%!\n')
  24.   IF StrCmp(arg,'',1) OR StrCmp(arg,'?',2)
  25.     error(ER_USAGE)
  26.   ELSE
  27.     flen:=FileLength(arg)
  28.     handle:=Open(arg,1005)
  29.     IF (flen<1) OR (handle=NIL)
  30.       error(ER_FILE)
  31.     ELSE
  32.       IF (mem:=New(flen))=NIL
  33.         error(ER_MEM)
  34.       ELSE
  35.         IF Read(handle,mem,flen)<>flen THEN error(ER_FILE) ELSE process()
  36.       ENDIF
  37.     ENDIF
  38.   ENDIF
  39.   error(ER_NONE)
  40. ENDPROC
  41.  
  42. PROC process()
  43.   DEF end
  44.   o:=mem
  45.   end:=o+flen
  46.   IF (o[]++<>"FORM") THEN error(ER_FILETYPE)
  47.   IF flen-8<>o[]++ THEN error(ER_CORRUPT)
  48.   WriteF('IFF Chunk layout of file "\s" (\d bytes)\n\n',arg,flen)
  49.   form(end)
  50. ENDPROC
  51.  
  52. PROC form(end)
  53.   DEF itype
  54.   INC off
  55.   itype:=ifftype
  56.   sp(); writetype(); WriteF('\n')
  57.   WHILE o<end
  58.     IF CtrlC() THEN error(ER_BREAK)
  59.     chunkid:=o[]++
  60.     size:=o[]++
  61.     legal({chunkid})
  62.     sp(); WriteF('"\s[4]" (\d[7] bytes) ',{chunkid},size)
  63.     SELECT ifftype
  64.       CASE "ILBM"
  65.         SELECT chunkid
  66.           CASE "BMHD"; WriteF('Bitmapheader\n'); showbmhd()
  67.           CASE "CMAP"; WriteF('Colourmap\n')
  68.           CASE "CAMG"; WriteF('Amiga specific graphic mode\n')
  69.           CASE "BODY"; WriteF('Bitmap data\n')
  70.           CASE "CRNG"; WriteF('Colour range\n')
  71.           CASE "CCRT"; WriteF('Colour cycling and timing\n')
  72.           CASE "GRAB"; WriteF('Grab position of brush\n')
  73.           CASE "DEST"; WriteF('Destination bitplanes\n')
  74.           CASE "SPRT"; WriteF('Sprite definition\n')
  75.           CASE "GRAB"; WriteF('Grab position of brush\n')
  76.           CASE "DPAN"; WriteF('DpaintAnim infos\n')
  77.           CASE "DPPS"; WriteF('Dpaint\n')
  78.           CASE "ANHD"; WriteF('Animation header\n')
  79.           CASE "DLTA"; WriteF('Delta\n')
  80.           CASE "PTXT"; WriteF('Picture text\n')
  81.           CASE "ATXT"; WriteF('Anim text\n')
  82.           CASE "ANFR"; WriteF('Anim frame\n')
  83.           CASE "MAHD"; WriteF('Multiple anim header (?)\n')
  84.           CASE "MFHD"; WriteF('Multiple frame header (?)\n')
  85.           CASE "CM16"; WriteF('Colourmap 16\n')
  86.           CASE "SHAK"; WriteF('Shakespeare chunk (?)\n')
  87.           CASE "FORM"; WriteF('Embedded IFF in anim: \n\n'); form(o+size); WriteF('\n')
  88.           DEFAULT; errorid()
  89.         ENDSELECT
  90.       CASE "ANIM"
  91.         errorid()
  92.       CASE "8SVX"
  93.         SELECT chunkid
  94.           CASE "VHDR"; WriteF('Voice Header\n')
  95.           CASE "(c) "; WriteF('Copyright notice: '); pstr();
  96.           CASE "AUTH"; WriteF('Owner of the digitizer: '); pstr();
  97.           CASE "ANNO"; WriteF('Annotations: '); pstr()
  98.           CASE "ATAK"; WriteF('Attack\n')
  99.           CASE "RLSE"; WriteF('Release\n')
  100.           CASE "BODY"; WriteF('Sample data\n')
  101.           CASE "NAME"; WriteF('Title of sample: '); pstr()
  102.           DEFAULT; errorid()
  103.         ENDSELECT
  104.       CASE "SMUS"
  105.         SELECT chunkid
  106.           CASE "SHDR"; WriteF('Score Header\n')
  107.           CASE "(c) "; WriteF('Copyright notice: '); pstr()
  108.           CASE "AUTH"; WriteF('Author of the score: '); pstr()
  109.           CASE "ANNO"; WriteF('Annotations: '); pstr()
  110.           CASE "INS1"; WriteF('Instrument definition\n')
  111.           CASE "TRAK"; WriteF('The actual score\n')
  112.           CASE "IREV"; WriteF('Huh?\n')
  113.           CASE "NAME"; WriteF('Title of score: '); pstr()
  114.           CASE "SNX1"; WriteF('Sonix data\n')
  115.           DEFAULT; errorid()
  116.         ENDSELECT
  117.       CASE "FTXT"
  118.         SELECT chunkid
  119.           CASE "FONS"; WriteF('Font definition\n')
  120.           CASE "CHRS"; WriteF('Text characters\n')
  121.           DEFAULT; errorid()
  122.         ENDSELECT
  123.       CASE "PREF"
  124.         SELECT chunkid
  125.           CASE "PRHD"; WriteF('Prefs header\n')
  126.           CASE "FONT"; WriteF('Font prefs\n')
  127.           CASE "INPT"; WriteF('Input prefs\n')
  128.           DEFAULT; errorid()
  129.         ENDSELECT
  130.       CASE "MDBI"
  131.         SELECT chunkid
  132.           CASE "STRG"; WriteF('Strings\n'); dbstrings()
  133.           CASE "TYPE"; WriteF('Type infos of idents/funcs etc.\n'); dbtype()
  134.           CASE "ILST"; WriteF('Object infos\n')
  135.           CASE "ENUM"; WriteF('Enum ascii equivalents\n')
  136.           CASE "SCOP"; WriteF('Scope infos\n')
  137.           CASE "HUNK"; WriteF('Hunk infos\n')
  138.           CASE "SRCS"; WriteF('Source filename\n')
  139.           CASE "POSN"; WriteF('Code to source pointers\n')
  140.           DEFAULT; errorid()
  141.         ENDSELECT
  142.       CASE "GXUI"; gtbchunks()
  143.       CASE "GXWD"; gtbchunks()
  144.       CASE "GXGA"; gtbchunks()
  145.       CASE "GXBX"; gtbchunks()
  146.       CASE "GXTX"; gtbchunks()
  147.       CASE "GXMN"; gtbchunks()
  148.       DEFAULT; errorid()
  149.     ENDSELECT
  150.     o:=o+size
  151.     IF o AND 1 THEN INC o
  152.   ENDWHILE
  153.   size:=0
  154.   ifftype:=itype
  155.   DEC off
  156. ENDPROC
  157.  
  158. PROC writetype()
  159.   DEF type
  160.   type:=o[]++
  161.   legal({type})
  162.   WriteF('Type: ')
  163.   ifftype:=IF type="ANIM" THEN "ILBM" ELSE type
  164.   SELECT type
  165.     CASE "ILBM"; WriteF('Interleaved bitmap\n')
  166.     CASE "FTXT"; WriteF('Formatted text\n')
  167.     CASE "8SVX"; WriteF('8 bit sound sample\n')
  168.     CASE "ANIM"; WriteF('Animation\n')
  169.     CASE "SMUS"; WriteF('Music score\n')
  170.     CASE "PREF"; WriteF('OS 2.0 prefs file\n')
  171.     CASE "MDBI"; WriteF('Maxon Sourcelevel Debugger file\n')
  172.     CASE "GXUI"; WriteF('GadToolsBox GUI file\n')
  173.     CASE "GXWD"; WriteF('GadToolsBox Window file\n')
  174.     CASE "GXGA"; WriteF('GadToolsBox Gadget file\n')
  175.     CASE "GXBX"; WriteF('GadToolsBox BevelBox file\n')
  176.     CASE "GXTX"; WriteF('GadToolsBox Text file\n')
  177.     CASE "GXMN"; WriteF('GadToolsBox Menu file\n')
  178.     DEFAULT
  179.       chunkid:=type
  180.       errorid()
  181.   ENDSELECT
  182. ENDPROC type
  183.  
  184. PROC dbstrings()
  185.   DEF h:PTR TO dbhd,s,i,c,a
  186.   h:=o; s:=o+4
  187.   i:=h.firstindex
  188.   c:=h.recordsize /* numentries in this case */
  189.   IF c>0
  190.     FOR a:=1 TO c
  191.       sp(); WriteF('  string #\d="\s"\n',i++,s)
  192.       WHILE s[]++ DO NOP
  193.     ENDFOR
  194.   ENDIF
  195. ENDPROC
  196.  
  197. PROC dbtype()
  198.   DEF h:PTR TO dbhd,s,i,c,csize,t
  199.   h:=o; s:=o+4; csize:=size-4
  200.   i:=h.firstindex
  201.   c:=h.recordsize
  202.   WHILE csize>0
  203.     t:=s[]
  204.     sp(); WriteF('  type #\d=\d\n',i++,t)
  205.     csize:=csize-c
  206.   ENDWHILE
  207. ENDPROC
  208.  
  209. PROC showbmhd()
  210.   DEF b:PTR TO bmhd
  211.   b:=o; WriteF('\n')
  212.   sp(); WriteF('Width,Height=(\d,\d)\n',b.w,b.h)
  213.   sp(); WriteF('ScreenWidth,ScreenHeight=(\d,\d)\n',b.pagew,b.pageh)
  214.   sp(); WriteF('Planes=\d\n',b.planes)
  215.   sp(); WriteF('Xaspect,Yaspect=(\d,\d)\n',b.xaspect,b.yaspect)
  216.   sp(); WriteF('Compression=')
  217.   IF b.compression THEN WriteF('ON\n') ELSE WriteF('OFF\n')
  218.   sp(); WriteF('Transparant colour=\d\n\n',b.transcolour)
  219. ENDPROC
  220.  
  221. PROC legal(id:PTR TO CHAR)              /* call by reference */
  222.   DEF a
  223.   FOR a:=0 TO 3 DO IF (id[a]<32) OR (id[a]>126) THEN id[a]:="."
  224. ENDPROC
  225.  
  226. PROC pstr()
  227.   sp(); WriteF('"')
  228.   Write(stdout,o,size)
  229.   WriteF('"\n')
  230. ENDPROC
  231.  
  232. PROC error(nr)
  233.   IF handle THEN Close(handle)
  234.   WriteF('\n')
  235.   SELECT nr
  236.     CASE ER_FILE;     WriteF('Could not read file "\s" !\n',arg)
  237.     CASE ER_MEM;      WriteF('No memory for chunks!\n')
  238.     CASE ER_USAGE;    WriteF('USAGE: showchunk <ifffile>\n')
  239.     CASE ER_BREAK;    WriteF('** BREAK: ShowChunk\n')
  240.     CASE ER_FILETYPE; WriteF('Not an IFF file.\n')
  241.     CASE ER_CORRUPT;  WriteF('IFF file format corrupt.\n')
  242.   ENDSELECT
  243.   IF nr=ER_USAGE
  244.     WriteF('recognized chunks:\n\n')
  245.     WriteF('ILBM,ANIM Picture and Animation format\n')
  246.     WriteF('- BMHD CMAP CAMG BODY CRNG CCRT GRAB DEST SPRT\n')
  247.     WriteF('  GRAB DPAN DPPS PTXT ATXT ANFR MAHD MFHD CM16\n')
  248.     WriteF('  SHAK ANHD DLTA\n\n')
  249.     WriteF('8SVX Samples\n')
  250.     WriteF('- VHDR NAME AUTH ANNO ATAK RLSE BODY (c)\n\n')
  251.     WriteF('SMUS Score files\n')
  252.     WriteF('- SHDR NAME AUTH ANNO INS1 TRAK IREV SNX1 (c)\n\n')
  253.     WriteF('FTXT Text\n')
  254.     WriteF('- FONT CHRS\n\n')
  255.     WriteF('PREF 2.0 Preferences\n')
  256.     WriteF('- PRHD FONT INPT\n\n')
  257.     WriteF('MDBI Maxon SDB\n')
  258.     WriteF('- STRG TYPE ILST ENUM SCOP HUNK SRCS POSN\n\n')
  259.     WriteF('GXUI,GXMN,GXTX,GXBX,GXGA,GXWD GadToolsBox GUI\n')
  260.     WriteF('- MEDA ITXT BBOX GADA WDDA GGUI VERS\n')
  261.     WriteF('\n')
  262.   ENDIF
  263.   CleanUp(0)
  264. ENDPROC
  265.  
  266. PROC errorid()
  267.   WriteF('Unknown chunk id: "\s[4]" !\n',{chunkid})
  268. ENDPROC
  269.  
  270. PROC sp()
  271.   DEF a
  272.   IF off>0 THEN FOR a:=1 TO off DO WriteF('\t')
  273. ENDPROC
  274.  
  275. PROC gtbchunks()
  276.   SELECT chunkid
  277.     CASE "MEDA"; WriteF('Menu Data\n')
  278.     CASE "ITXT"; WriteF('Intuitext\n')
  279.     CASE "BBOX"; WriteF('BevelBox\n')
  280.     CASE "GADA"; WriteF('Gadget\n')
  281.     CASE "WDDA"; WriteF('Window\n')
  282.     CASE "GGUI"; WriteF('GUI definition\n')
  283.     CASE "VERS"; WriteF('Future version extension\n')
  284.     CASE "FORM"; WriteF('Embedded IFF in file:\n\n'); form(size+o); WriteF('\n')
  285.     DEFAULT; errorid()
  286.   ENDSELECT
  287. ENDPROC
  288.